/**
 * 网络请求工具
 * @description 封装钉钉小程序网络请求，统一处理错误和loading
 * @author 系统重构
 * @date 2023-10-01
 */

/**
 * 基础请求函数
 * @param {Object} options - 请求配置
 * @param {string} options.url - 请求地址
 * @param {string} options.method - 请求方法
 * @param {Object} options.data - 请求数据
 * @param {boolean} options.showLoading - 是否显示加载提示
 * @returns {Promise} 返回Promise对象
 */
function request(options) {
  const { url, method = 'GET', data = {}, showLoading = true } = options;
  
  if (showLoading) {
    dd.showLoading({
      content: '加载中...'
    });
  }
  
  return new Promise((resolve, reject) => {
    dd.httpRequest({
      url,
      method,
      data,
      dataType: 'json',
      success: (res) => {
        // 判断HTTP状态码
        if (res.status >= 200 && res.status < 300 || res.status === undefined) {
          // 请求成功，但要看具体数据结构
          try {
            // 处理各种可能的返回格式
            if (res.data) {
              // 如果有status字段且不为200，视为错误
              if (res.data.status && res.data.status !== 200) {
                console.warn('API请求返回错误状态码', res.data.status);
                dd.showToast({
                  type: 'fail',
                  content: res.data.message || '请求失败',
                  duration: 2000
                });
                reject(res.data);
                return;
              }
              
              // 如果有code字段，根据code判断
              if (res.data.code !== undefined) {
                if (res.data.code === 0 || res.data.code === 200) {
                  // 成功状态码
                  let resultData = res.data.data || res.data.rows || res.data;
                  resolve(resultData);
                  return;
                } else {
                  // 错误状态码
                  console.warn('API请求返回错误code', res.data.code);
                  dd.showToast({
                    type: 'fail',
                    content: res.data.message || '请求失败',
                    duration: 2000
                  });
                  reject(res.data);
                  return;
                }
              }
              
              // 没有明确的状态码，直接返回数据
              resolve(res.data);
              return;
            }
            
            // res.data不存在，可能直接返回了数据
            resolve(res);
          } catch (error) {
            console.error('解析API响应出错', error);
            dd.showToast({
              type: 'fail',
              content: '数据解析失败',
              duration: 2000
            });
            reject(error);
          }
        } else {
          // HTTP请求失败
          console.error('HTTP请求失败', res.status);
          dd.showToast({
            type: 'fail',
            content: `请求失败(${res.status})`,
            duration: 2000
          });
          reject(res);
        }
      },
      fail: (err) => {
        console.error('网络请求失败', err);
        dd.showToast({
          type: 'fail',
          content: '网络异常，请重试',
          duration: 2000
        });
        reject(err);
      },
      complete: () => {
        if (showLoading) {
          dd.hideLoading();
        }
      }
    });
  });
}

/**
 * GET请求
 * @param {string} url - 请求地址
 * @param {Object} data - 请求参数
 * @param {boolean} showLoading - 是否显示加载提示
 * @returns {Promise} 返回Promise对象
 */
function get(url, data = {}, showLoading = true) {
  return request({
    url,
    method: 'GET',
    data,
    showLoading
  });
}

/**
 * POST请求
 * @param {string} url - 请求地址
 * @param {Object} data - 请求数据
 * @param {boolean} showLoading - 是否显示加载提示
 * @returns {Promise} 返回Promise对象
 */
function post(url, data = {}, showLoading = true) {
  return request({
    url,
    method: 'POST',
    data,
    showLoading
  });
}

/**
 * 上传文件
 * @param {string} url - 上传地址
 * @param {string} filePath - 文件路径
 * @param {string} fileName - 文件名
 * @param {Object} data - 附加数据
 * @returns {Promise} 返回Promise对象
 */
function uploadFile(url, filePath, fileName = 'file', data = {}) {
  dd.showLoading({
    content: '上传中...'
  });
  
  return new Promise((resolve, reject) => {
    dd.uploadFile({
      url,
      filePath,
      fileName,
      fileType: 'image',
      formData: data,
      success: (res) => {
        try {
          const result = JSON.parse(res.data);
          if (result.code === 0) {
            resolve(result.data);
          } else {
            dd.showToast({
              type: 'fail',
              content: result.message || '上传失败',
              duration: 2000
            });
            reject(result);
          }
        } catch (error) {
          dd.showToast({
            type: 'fail',
            content: '解析响应失败',
            duration: 2000
          });
          reject(error);
        }
      },
      fail: (err) => {
        dd.showToast({
          type: 'fail',
          content: '上传失败',
          duration: 2000
        });
        reject(err);
      },
      complete: () => {
        dd.hideLoading();
      }
    });
  });
}

// 导出所有函数
module.exports = {
  request,
  get,
  post,
  uploadFile
}; 